The following program estimates an unrestricted VAR and obtains various plots of impulse response functions. Note (1) how we store the responses in a named matrix, and (2) how we plot the accumulated responses together with the long-run response.
' impulse response functions' replicates Lutkepohl (1991) pp.105-113' 1/7/2000 h' last checked 3/7/2007 'change path to program path%path = @runpathcd %path ' load workfileload lut1 ' estimate VARsmpl 1960:1 1978:4var1.ls 1 2 y1 y2 y3 @ c '--------------------------------------------------------------' unit impulse'--------------------------------------------------------------' Fig 3.4 (p.107)freeze(fig34) var1.impulse(m,imp=unit,matbys=tab33_1) y3 @ y2 ' Fig 3.5 (p.107)freeze(fig35) var1.impulse(m,imp=unit) y1 @ y3 ' combine two graphs into onefreeze(fig_p107) fig34 fig35show fig_p107 '--------------------------------------------------------------' accumulated response to unit impulse'--------------------------------------------------------------' Fig 3.6 (p.109)freeze(fig36) var1.impulse(m,a,imp=unit,matbys=tab33_2) y3 @ y2 ' get long-run response (bottom right matrix in Table 3.3, p.106)matrix lrrsp33 = var1.@lrrsp ' add long-run response to impulse response graph!dtmp = lrrsp33(3,2)fig36.draw(dashline,left) !dtmp ' Fig 3.7 (p.109)freeze(fig37) var1.impulse(m,a,imp=unit) y1 @ y3' add long-run response to impulse response graph!dtmp = lrrsp33(1,3)fig37.draw(dashline,left) !dtmp ' combine two graphs into onefreeze(fig_p109) fig36 fig37show fig_p109 '--------------------------------------------------------------' cholesky impulse'--------------------------------------------------------------' Fig 3.8 (p.112)freeze(fig38) var1.impulse(m,imp=chol,matbys=tab34_1) y3 @ y2 ' Fig 3.9 (p.112)freeze(fig39) var1.impulse(m,a,imp=chol,matbys=tab34_2) y3 @ y2 ' get long-run response (bottom right matrix in Table 3.4, p.111)matrix lrrsp34 = var1.@lrrsp ' add long-run response to impulse response graph!dtmp = lrrsp34(3,2)fig39.draw(dashline,left) !dtmp ' combine two graphs into onefreeze(fig_p112) fig38 fig39show fig_p112
The following program plots the impulse response analytic standard errors and the Monte Carlo standard errors in one graph. The program calls a subroutine sub_irfgraph() to do the job. This subroutine requires you to pass in the standard errors in a matrix as stored by the matbys= or matbyr= option of the impulse command (the standard errors are stored in a matrix with _se appended to the name you provided for the impulse responses).
' compare analytic and monte-carlo impulse response s.e.' plots the two standard error bands in one graph' 1/31/2000 h' last checked 3/7/2007 ' include subroutineinclude sub_irfgraph.prg 'change path to program path%path = @runpathcd %path ' load workfileload lut1 ' estimate VAR smpl 1960:1 1978:4 var1.ls 1 2 y1 y2 y3 @ c !hrz = 10 ' response periods!rep = 500 ' monte carlo replications ' get analytic impulse response standard errorsvar1.impulse(m,imp=chol,se=a,matbyr=analyt) ' get monte carlo impulse response standard errorsvar1.impulse(m,imp=chol,se=mc,rep=!rep,matbyr=mcarlo) ' plot in one graph%gname = "fig1"call sub_irfgraph(analyt, analyt_se, mcarlo_se, %gname)' add zero line to all graphs{%gname}.draw(line,left) 0' add title to graph{%gname}.addtext(t) Comparison of Impulse Response Standard Errors (Analytic---Red vs Monte Carlo---Green) show {%gname}
The subroutine file sub_irfgraph.prg looks as follows:
' plot analytic and monte carlo standard errors in one graph' need to pass results stored in a matrix using the ' matbys= option of impulse command' version 4 beta' 1/31/2000 h' last revised and checked 9/19/2000 h ' rps = name of matrix specified by matbys = option' se1 = name of matrix of standard errors returned by matbys = option (with _se post-fix)' se2 = name of matrix of standard errors returned by matbys = option (with _se post-fix)' %gname = name for final combined graph subroutine sub_irfgraph(matrix rsp, matrix se1, matrix se2, string %gname) !hrz = @rows(rsp)!k2 = @columns(rsp) vector vvector vbdmatrix rspse1 = se1*2matrix rspse2 = se2*2 matrix(!hrz,5) tmp ' plot each graph separately for !c=1 to !k2 ' get point estimates v = @columnextract(rsp,!c) colplace(tmp,v,1) ' get bounds using first input vbd = v + @columnextract(rspse1,!c) colplace(tmp,vbd,2) vbd = v - @columnextract(rspse1,!c) colplace(tmp,vbd,3) ' get bounds using second input vbd = v + @columnextract(rspse2,!c) colplace(tmp,vbd,4) vbd = v - @columnextract(rspse2,!c) colplace(tmp,vbd,5) freeze(tmp_graph{!c}) tmp.line tmp_graph{!c}.elem(1) lcolor(blue) lpat(solid) tmp_graph{!c}.elem(2) lcolor(red) lpat(dash1) tmp_graph{!c}.elem(3) lcolor(red) lpat(dash1) tmp_graph{!c}.elem(4) lcolor(green) lpat(dash2) tmp_graph{!c}.elem(5) lcolor(green) lpat(dash2) tmp_graph{!c}.option linepat ' need to set linepat tmp_graph{!c}.legend(off)' tmp_graph{!c}.legend -display %namelist = %namelist + "tmp_graph" + @str(!c) + " "next ' combine graphsfreeze({%gname}) {%namelist} delete v vbd rspse1 rspse2 {%namelist} endsub
The following program estimates an unrestricted VAR and computes variance decompositions with Monte Carlo standard errors (for 500 replications). The matbyr=mat35 option stores the results in three matrices. MAT35 contains the variance decompositions, MAT35_FSE constains the forecast standard errors, and MAT35_SE contains the Monte Carlo decomposition standard errors. (Note that the results do not quite match those reported in Lutkepohl (1991) Table 3.5, p.113, which uses analytic standard errors.)
' variance decomposition' replicates Lutkepohl (1991) pp.111-113' 1/10/2000 h' last checked 3/7/2007 'change path to program path%path = @runpathcd %path ' load workfileload lut1 ' estimate VARsmpl 1960:1 1978:4var1.ls 1 2 y1 y2 y3 @ c ' variance decomposition with Monte Carlo standard errorsfreeze(tab35) var1.decomp(t,imp=chol,se=mc,rep=500,matbyr=mat35) y1 y2 y3 @ @ y1 y2 y3show tab35